如何打印Yacc中发生错误的行?

问题描述

现在我有以下代码

int yyerror( char *s ) 
{ 
    numberOfErrors ++;
    fprintf( stderr,"%s in line %d \n",s,yylineno ); 
}

代码显示错误原因和行号,例如Syntax error in line 9 但是我想做的是,也打印发生错误的行。例如,如果第9行为:printf("Hello World";(有错字。缺少“)”),则应打印

Syntax error in line 9: printf("Hello World";

有没有办法做到这一点?谢谢。

解决方法

不容易。

输入由扫描仪而不是解析器读取。此外,扫描器并未真正与解析器同步:它通常用于识别尚未由解析器分析的令牌。因此,即使扫描程序的变量包含“当前行”,该行也通常是解析器正在查看的包含令牌的行之后的行。如果扫描仪跳过了较长的注释,甚至可能是后续的一行。

通常,扫描仪实际上没有包含当前行的缓冲区,因为它不需要它。它仅需要当前正在扫描的令牌。扫描程序通常以固定长度的块而不是行来读取输入,因为它效率更高,因此无法保证当前行中的所有行都包含在当前块中。

如果您使用的是import tensorflow as tf from tensorflow import keras from tensorflow.keras.datasets import cifar10 from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Dropout,Activation,Flatten from tensorflow.keras.layers import Conv2D,MaxPooling2D from tensorflow.keras.callbacks import TensorBoard import numpy as np import time import pickle import matplotlib.pyplot as plt from tensorflow import keras from kerastuner.tuners import RandomSearch from kerastuner.engine.hyperparameters import HyperParameters pickle_in = open("X.pickle","rb") x_train = pickle.load(pickle_in) pickle_in = open("y.pickle","rb") y_train = pickle.load(pickle_in) pickle_in = open("X2.pickle","rb") x_test = pickle.load(pickle_in) pickle_in = open("y2.pickle","rb") y_test = pickle.load(pickle_in) x_train=np.array(x_train/255.0) y_train=np.array(y_train) x_test=np.array(x_test/255.0) y_test=np.array(y_test) LOG_DIR = f"{int(time.time())}" def build_model(hp): model = keras.models.Sequential() model.add(Conv2D(hp.Int("input_units",32,256,32 ),(3,3),input_shape=x_train.shape[1:])) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2,2))) for i in range(hp.Int("n_layers",1,4)): model.add(Conv2D(hp.Int(f"conv-{i}_units",3))) model.add(Activation('relu')) model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors model.add(Dense(10)) model.add(Activation("softmax")) model.compile(optimizer="adam",loss="binary_crossentropy",metrics=["accuracy"]) return model tuner = RandomSearch( build_model,objective = "val_accuracy",max_trials = 1,executions_per_trial = 1,directory = LOG_DIR) tuner.search(x=x_train,y=y_train,epochs=1,batch_size=64,validation_data=(x_test,y_test)) with open(f"tuner_{int(time.time())}.pkl","wb") as f: pickle.dump(tuner,f) tuner = pickle.load(open("")) print(tuner.get_best_hyperparameters()[0].values) ,则可以更改其输入方法,以便逐行读取。但这还不够,因为如上所述,扫描仪的当前行通常不是我们感兴趣的行。

在这里值得注意的是,扫描仪通常会向前读取这一事实会影响解析器错误消息中flex的使用。在许多情况下,这将导致错误报告在错误之后甚至以后识别出行。但是,这很容易解决,因为野牛提供​​了将位置对象与每个标记保持在一起的可能性。不幸的是,柔性扫描仪不会自动填充位置对象,但是只需几行代码即可。有关代码示例,请参见this answer

如果输入是常规文件,则很容易重新读取文件以查找特定行。例如,如果输入是管道,那将行不通,但这可能是一个不错的开始。